From 23b4cad2cd3f9a2c5f44e8ae0c5944b3410fadfa Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Fri, 14 Jan 2011 15:21:24 +0000 Subject: [PATCH] hvmloader: Fixes to printf() implementation. 1. Remove unportable O and D format specifiers 2. Fix X format specifier to print upper-case hex characters 3. Fix d format specifier to print -ve numbers 4. Fix handling of int vs. long (although not actually an issue for the i386 compile target) 5. Don't use the antiquated C 'register' type attribute. Signed-off-by: Keir Fraser --- tools/firmware/hvmloader/util.c | 43 +++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index fe561a4f99..c58ea1071a 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -425,10 +425,10 @@ static char *printnum(char *p, unsigned long num, int base) static void _doprint(void (*put)(char), const char *fmt, va_list ap) { - register char *str, c; + char *str, c; int lflag, zflag, nflag; char buffer[17]; - unsigned value; + unsigned long value; int i, slen, pad; for ( ; *fmt != '\0'; fmt++ ) @@ -457,29 +457,40 @@ static void _doprint(void (*put)(char), const char *fmt, va_list ap) lflag = 1; c = *++fmt; } - if ( (c == 'd') || (c == 'u') || (c == 'o') || (c == 'x') ) + if ( (c == 'd') || (c == 'u') || (c == 'o') || + (c == 'x') || (c == 'X') ) { if ( lflag ) - value = va_arg(ap, unsigned); + { + value = va_arg(ap, unsigned long); + if ( (c == 'd') && ((long)value < 0) ) + { + value = -value; + put('-'); + } + } else - value = (unsigned) va_arg(ap, unsigned int); - str = buffer; - printnum(str, value, - c == 'o' ? 8 : (c == 'x' ? 16 : 10)); - goto printn; - } - else if ( (c == 'O') || (c == 'D') || (c == 'X') ) - { - value = va_arg(ap, unsigned); + { + value = va_arg(ap, unsigned int); + if ( (c == 'd') && ((int)value < 0) ) + { + value = -(int)value; + put('-'); + } + } str = buffer; printnum(str, value, - c == 'O' ? 8 : (c == 'X' ? 16 : 10)); - printn: + c == 'o' ? 8 : ((c == 'x') || (c == 'X') ? 16 : 10)); slen = strlen(str); for ( i = pad - slen; i > 0; i-- ) put(zflag ? '0' : ' '); while ( *str ) - put(*str++); + { + char ch = *str++; + if ( (ch >= 'a') && (c == 'X') ) + ch += 'A'-'a'; + put(ch); + } } else if ( c == 's' ) { -- 2.30.2